#python中的生成器和迭代器及其使用方式

'''
迭代器实现了__next__方法，返回序列中的下一个元素；如果没有元素了，
那么抛出 StopIteration 异常。另外迭代器实现了__iter__方法，用于返回迭代器本身。

所有生成器都是迭代器，会生成传给 yield 关键字的表达式的值。调用生成器函数返回生成器，
而生成器可以产出值。同样，当没有值可以产出时，会抛出 StopIteration 异常。

'''



#问题：魔法函数__call__怎么使用
'''
魔法函数__call__可以模拟可调用对象，这个方法在实例作为一个函数被 “调用” 时被调用；
如果定义了此方法，则 x(arg1, arg2, ...) 就相当于 x.__call__(arg1, arg2, ...) 的快捷方式。
'''

#一般情况下，我们是不需要直接调用魔法方法，只有在定制的类中，你可以去重写它们
class MyClass:
    def __call__(self, *args):
        print(*args)

obj = MyClass()
obj(123)

